<?php

/**
 * CongMuaSam
 * Dự án congmuasam.vn
 *
 * @package     CongMuaSam
 * @author      Jin Pig <huytq@jinpig.net>
 * @copyright   Copyright (c) 2012, DTC Vietnam.
 * @link        http://congmuasam.vn
 * @version     $Id$
 */

/**
 * Lớp User
 * Đây là lớp dùng để tương tác với người dùng.
 *
 * @package     CongMuaSam
 * @subpackage  User
 * @author      Jin Pig <huytq@jinpig.net>
 * @copyright   Copyright (c) 2012, Lifemo Dev Team.
 */
class class_member extends class_manage
{

	/*
	*| DuyK - Add and edited
	*| __construct function
	*/
	public $userid;
	function __construct()
		{
		parent::__construct();
			// Fetch user_id
			$userid = @$this->data->queryFirst("SELECT user_id FROM user_online WHERE hash='".$_SESSION['hash']."'");
			$this->userid = @intval($userid['user_id']);
		}

    /**
     * Hàm get_info
     * Hàm này sẽ trả về thông tin của người dùng.
     *
     * @access  public
     * @param   int     $userid (Optional) Id người dùng
     * @return  array
     */
    public function user_info($column, $userid = 0)
    {
        if ($userid <= 0)
        {
            $userid = $this->userid;
        }

        $userid = intval($userid);
		
		if(!isset($this->user_info))
			{
			$user = $this->data->queryFirst("SELECT ".$column."
				FROM `user_info`
				WHERE `user_id` = " . $userid . "
				LIMIT 0,1");

			$this->user_info = $user;
			
			}
		return $this->user_info;
    }
	
	/*
	*| Function get info by username
	*/
	public function user_info_by_username($column, $username)
		{
			$username = $this->data->escapeString($username);
			$query = $this->data->queryFirst("SELECT ".$column." FROM user_info WHERE username='".$username."'");
			return $query;
		}

    /**
     * Hàm set_auth
     * Hàm này sẽ tạo phiên làm việc cho người dùng.
     *
     * @access  public
     * @param   int     $userid     Id người dùng
     * @param   bool    $remember   (Optional) Ghi nhớ tài khoản
     * @return  bool
     */
    public function set_auth($userid, $remember = FALSE)
    {
        $user = $this->data->queryFirst("SELECT user_id, username, password
            FROM `user_info`
            WHERE `user_id` = '" . intval($userid) . "'
            LIMIT 0,1");

        if (count($user) <= 0)
        {
            return FALSE;
        }

        $session_hash = sha1($user['user_id'] . $user['password'] . time());
        $time = time() + 900;

        if ($remember !== FALSE)
        {
            $time = $time + (3600*24*365*100);
        }

        $data = array(
            'user_id'  => $user['user_id'],
            'hash'      => $session_hash,
            'date'      => $time,
        );
        $this->data->insert('user_online', $data);
        setcookie('session_hash', $session_hash, $time);
		setcookie('user_id', $user['user_id'], $time);
        $_SESSION['user_id'] = $user['user_id'];
        $_SESSION['hash'] = $session_hash;

        return TRUE;
    }

    /**
     * Hàm unset_auth
     * Hàm này sẽ hủy phiên làm việc cho người dùng.
     *
     * @access  public
     * @return  array
     */
    public function unset_auth()
    {
        if ($this->userid <= 0)
        {
            return FALSE;
        }

        $this->data->query("DELETE FROM `user_online`
            WHERE `user_id` = " . $this->userid . "");
        setcookie('session_hash', $session_hash, -1);
        unset($_SESSION['userid']);
        unset($_SESSION['hash']);

        return TRUE;
    }

    /**
     * Hàm check_auth
     * Hàm này sẽ kiểm tra xem người dùng đã đăng nhập hay chưa.
     *
     * @access  public
     * @return  int|bool
     */
    public function check_login()
    {
        $this->data->query("DELETE FROM `user_online`
            WHERE `date` < " . time() . "");

        if (!isset($_SESSION['hash']) or !isset($_SESSION['user_id']))
        {
            return FALSE;
        }

        $session = $this->data->queryFirst("SELECT *
            FROM `user_online`
            WHERE user_id='".intval($this->userid)."' AND `hash` = '" . $this->data->escapeString($_COOKIE['session_hash']) . "'
            LIMIT 0,1");

        if (count($session) <= 0)
        {
            return FALSE;
        }

        $this->data->update('user_online', array('date' => ($session['date'] + 300)), 'user_id = ' . $session['user_id']);

        return $session['user_id'];
    }


    /**
     * Hàm user_login
     * Hàm này có tác dụng xác thực người dùng.
     *
     * @access  public
     * @param   int     $username   Tên người dùng
     * @param   bool    $password   Mật khẩu
     * @return  bool
     */
    public function user_login($username, $password)
    {
        $user = $this->data->queryFirst("SELECT user_id, username, password
            FROM `user_info`
            WHERE `username` = '" . $this->data->escapeString($username) . "'
            LIMIT 0,1");

        if (count($user) <= 0)
        {
            return FALSE;
        }

        $password = md5($password);

        if ($password == $user['password'])
        {
            return $user['user_id'];
        }

        return FALSE;
    }

    /**
     * Hàm user_dangky
     * Hàm này có tác dụng tạo người dùng mới.
     *
     * @access  public
     * @param   array   $data   Dữ liệu do người dùng gửi tới
     * @return  int|bool
     */
    public function user_dangky($data)
    {
        // Nếu không nhập username
        if ($this->_check_required($data['username']) !== TRUE)
        {
            return -1;
        }

        // Nếu không nhập mật khẩu
        if ($this->_check_required($data['password']) !== TRUE)
        {
            return -2;
        }

        // Nếu không nhập email
        if ($this->_check_required($data['email']) !== TRUE)
        {
            return -3;
        }

        // Nếu username không hượp lệ
        if ($this->_check_username($data['username']) !== TRUE)
        {
            return -4;
        }

        // Nếu username nhỏ hơn 6 ký tự hoặc lớn hơn 30 ký tự
        if ($this->_check_min_length($data['username'], 6) !== TRUE
            OR $this->_check_max_length($data['username'], 30) !== TRUE
        )
        {
            return -5;
        }

        // Nếu email không hợp lệ
        if ($this->_check_valid_email($data['email']) !== TRUE)
        {
            return -6;
        }

        $start = mt_rand(1, 15);
        //$data['salt'] = substr(mt_rand(), $start, ($start + 15));
        $data['password'] = md5($data['password']);
        $data['date_reg'] = time();

        $user = $this->data->insert('user_info', $data);

        if ($user !== FALSE)
        {
            return $user;
        }

        return FALSE;
    }

    private function _check_required($str)
    {
        if (!is_array($str))
        {
            return (trim($str) == '') ? FALSE : TRUE;
        }
        else
        {
            return (!empty($str));
        }
    }

    private function _check_min_length($str, $val)
    {
        if (preg_match("/[^0-9]/", $val))
        {
            return FALSE;
        }

        if (function_exists('mb_strlen'))
        {
            return (mb_strlen($str) < $val) ? FALSE : TRUE;
        }

        return (strlen($str) < $val) ? FALSE : TRUE;
    }

    private function _check_max_length($str, $val)
    {
        if (preg_match("/[^0-9]/", $val))
        {
            return FALSE;
        }

        if (function_exists('mb_strlen'))
        {
            return (mb_strlen($str) > $val) ? FALSE : TRUE;
        }

        return (strlen($str) > $val) ? FALSE : TRUE;
    }

    private function _check_username($str)
    {
        return (!preg_match("/^([a-z0-9])+$/i", $str)) ? FALSE : TRUE;
    }

    private function _check_valid_email($str)
    {
        return (!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
    }
}

/* Kết thúc tệp tin class_user.php */
